package project4;


import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 编程题2
 * 贷款计算器 - 计算等额本金和等额本息的利息
 */
public class LoanCalculator {

    /**
     * 还款方式枚举
     */
    public enum RepaymentMethod {
        EQUAL_PRINCIPAL,    // 等额本金
        EQUAL_INSTALLMENT   // 等额本息
    }

    /**
     * 计算贷款总利息
     *
     * @param method 还款方式
     * @param principal 贷款总额(万元)
     * @param months 贷款期限(月)
     * @param annualRate 年利率(如: 0.049 表示 4.9%)
     * @return 总利息(元)
     */
    public static BigDecimal calculateTotalInterest(RepaymentMethod method,
                                                    BigDecimal principal,
                                                    int months,
                                                    BigDecimal annualRate) {
        // 计算月利率
        BigDecimal monthlyRate = annualRate.divide(BigDecimal.valueOf(12), 10, RoundingMode.HALF_UP);

        // 将万元转换为元
        principal = principal.multiply(BigDecimal.valueOf(10000));

        if (method == RepaymentMethod.EQUAL_PRINCIPAL) {
            return calculateEqualPrincipalInterest(principal, months, monthlyRate);
        } else if (method == RepaymentMethod.EQUAL_INSTALLMENT) {
            return calculateEqualInstallmentInterest(principal, months, monthlyRate);
        } else {
            throw new IllegalArgumentException("Unsupported repayment method");
        }
    }

    /**
     * 计算等额本金总利息
     * 公式：(月数 + 1) * 贷款总额 * 月利率 / 2
     */
    private static BigDecimal calculateEqualPrincipalInterest(BigDecimal principal,
                                                              int months,
                                                              BigDecimal monthlyRate) {
        return principal
                .multiply(monthlyRate)
                .multiply(BigDecimal.valueOf(months + 1))
                .divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP);
    }

    /**
     * 计算等额本息总利息
     * 公式：(月供 * 还款月数 - 贷款总额)
     * 月供 = 贷款总额 * 月利率 * (1 + 月利率)^还款月数 / ((1 + 月利率)^还款月数 - 1)
     */
    private static BigDecimal calculateEqualInstallmentInterest(BigDecimal principal,
                                                                int months,
                                                                BigDecimal monthlyRate) {
        // 计算 (1 + 月利率)^还款月数
        BigDecimal pow = BigDecimal.ONE.add(monthlyRate)
                .pow(months);

        // 计算月供
        BigDecimal monthlyPayment = principal
                .multiply(monthlyRate)
                .multiply(pow)
                .divide(pow.subtract(BigDecimal.ONE), 10, RoundingMode.HALF_UP);

        // 计算总利息 = 月供 * 还款月数 - 贷款总额
        return monthlyPayment
                .multiply(BigDecimal.valueOf(months))
                .subtract(principal)
                .setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 测试用例方法
     */
    private static void testCase(BigDecimal principal, int months, BigDecimal annualRate) {
        // 计算等额本金总利息
        BigDecimal equalPrincipalInterest = calculateTotalInterest(
                RepaymentMethod.EQUAL_PRINCIPAL,
                principal,
                months,
                annualRate
        );

        // 计算等额本息总利息
        BigDecimal equalInstallmentInterest = calculateTotalInterest(
                RepaymentMethod.EQUAL_INSTALLMENT,
                principal,
                months,
                annualRate
        );

        System.out.println(String.format("贷款金额: %s万元", principal));
        System.out.println(String.format("贷款期限: %d月", months));
        System.out.println(String.format("年利率: %s%%", annualRate.multiply(BigDecimal.valueOf(100))));
        System.out.println(String.format("等额本金总利息: %.2f元", equalPrincipalInterest));
        System.out.println(String.format("等额本息总利息: %.2f元", equalInstallmentInterest));
        System.out.println(String.format("利息差额: %.2f元", equalInstallmentInterest.subtract(equalPrincipalInterest)));
    }

    /**
     * 验证方法
     */
    public static void main(String[] args) {
        // 测试用例1: 100万贷款，30年，年利率4.9%
        System.out.println("测试用例1: 100万贷款，30年，年利率4.9%");
        testCase(new BigDecimal("100"), 360, new BigDecimal("0.049"));

        // 测试用例2: 50万贷款，20年，年利率4.65%
        System.out.println("\n测试用例2: 50万贷款，20年，年利率4.65%");
        testCase(new BigDecimal("50"), 240, new BigDecimal("0.0465"));

        // 测试用例3: 20万贷款，5年，年利率4.35%
        System.out.println("\n测试用例3: 20万贷款，5年，年利率4.35%");
        testCase(new BigDecimal("20"), 60, new BigDecimal("0.0435"));
    }
}
